home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 8 / FM Towns Free Software Collection 8.iso / t_os / artemis / artsrc2 / gblkcpy.asm < prev    next >
Assembly Source File  |  1994-06-01  |  6KB  |  346 lines

  1. ;    私製ライブラリ・グラフィック篇
  2. ;    (c) MATSUUCHI Ryosuke in Dec,1992 - Jan,1993
  3. ;
  4. ;    gblkcpy.asm
  5. ;        領域指定による VRAM・VRAM間 / VRAM・メモリ間コピー
  6. ;
  7. ;    1992.12.29(Tue)
  8. ;    1993. 1. 4(Mon)
  9.  
  10.         public    _gblkcpy, gblkcpy
  11.         public    _gputblk, gputblk
  12.  
  13.         extrn    _gwrtreg:near
  14.         extrn    __SetVramSeg:near, __AddVramBase_ebx:near
  15.         extrn    __getpadrs:near
  16.         extrn    __getpscrmod:near
  17.  
  18.         include    grplib.inc
  19.  
  20.         assume    cs:cseg, ds:dseg
  21.  
  22.  
  23. dseg segment dword 'DATA'
  24.  
  25. s_linesize    dd    0    ;転送元の画面の1ラインのバイト数
  26. d_linesize    dd    0    ;転送先の画面の1ラインのバイト数
  27. _xcnt        dd    0
  28. _ycnt        dd    0
  29. _op        dd    0    ;演算指定
  30.  
  31.         ;各画面モードの1ラインのバイト数
  32. _scrlsiz    dd    0,320,320
  33.         dd    512,512            ;モード3~4(16色)
  34.         dd    512,512,512,512        ;モード5~8(3万色)
  35.         dd    1024,1024,1024        ;モード9~11(3万色)
  36.         dd    1024,1024,1024        ;モード12~14(256色)
  37.         dd    1024,1024,1024,1024    ;モード15~18(3万色)
  38.  
  39. _para        dd    0,0,0,0,0,0,0,0,0,0,0
  40.  
  41. dseg ends
  42.  
  43.  
  44. cseg segment dword 'CODE'
  45.  
  46. ;---------------------------------------------------------------
  47. ;    _ggetblk : 画面→メモリのブロック転送
  48. ;        in  eax : パラメータ配列へのポインタ
  49. ;    ※パラメータ配列:
  50. ;        + 0 DW  buf
  51. ;        + 4 DW  dx
  52. ;        + 8 DW  dy
  53. ;        +12 DW  xlen
  54. ;        +16 DW  ylen
  55. ;        +20 DW  operation
  56. ;    void gputblk(buf, dx,dy,xlen,ylen,operation)
  57. ;---------------------------------------------------------------
  58.  
  59.  
  60. ;---------------------------------------------------------------
  61. ;    _gputblk : メモリ→画面のブロック転送
  62. ;        in  eax : パラメータ配列へのポインタ
  63. ;    ※パラメータ配列:
  64. ;        + 0 DW  buf
  65. ;        + 4 DW  dx
  66. ;        + 8 DW  dy
  67. ;        +12 DW  xlen
  68. ;        +16 DW  ylen
  69. ;        +20 DW  operation
  70. ;    void gputblk(buf, dx,dy,xlen,ylen,operation)
  71. ;---------------------------------------------------------------
  72.  
  73.  
  74. _gputblk    proc
  75.         pushfd
  76.         pushad
  77.         push    es
  78.         push    fs
  79.         mov    ebp,eax
  80.         mov    ax,ds
  81.         mov    fs,ax
  82.         ;転送先の画面の1ラインのバイト数を調べる
  83.         mov    eax,[_wrtpage]
  84.         call    __getpscrmod
  85.         mov    ebx,[_scrlsiz+eax*4]
  86.         mov    [d_linesize],ebx
  87.         push    eax
  88.         ;[_xcnt],[_ycnt]を設定
  89.         mov    eax,[ebp+12]
  90.         mov    [_xcnt],eax
  91.         mov    eax,[ebp+16]
  92.         mov    [_ycnt],eax
  93.         mov    eax,[ebp+20]
  94.         mov    [_op],eax
  95.         ;es:edi に転送先アドレスを設定
  96.         mov    eax,[_wrtpage]
  97.         mov    ebx,[ebp+4]
  98.         mov    ecx,[ebp+8]
  99.         call    __getpadrs
  100.         mov    es,ax
  101.         mov    edi,ebx
  102.         ;ds:esi に転送元アドレスを設定
  103.         mov    esi,[ebp+0]
  104.         ;画面モードごとに分岐
  105.         pop    eax
  106.         cmp    eax,4
  107.         jg    #1
  108.             call    _gputblk_16    ;モード0~4
  109.             jmp    #2
  110.         #1:
  111.         cmp    eax,11
  112.         jg    #3
  113.             mov    eax,[ebp+12]
  114.             add    eax,eax
  115.             mov    [s_linesize],eax
  116.             call    _gblkcpy_32k    ;モード5~11
  117.             jmp    #2
  118.         #3:
  119.         cmp    eax,14
  120.         jg    #4
  121.             call    _gputblk_256    ;モード12~14
  122.             jmp    #2
  123.         #4:
  124.             mov    eax,[ebp+12]
  125.             add    eax,eax
  126.             mov    [s_linesize],eax
  127.             call    _gblkcpy_32k    ;モード15~
  128.         #2:
  129.         pop    fs
  130.         pop    es
  131.         popad
  132.         popfd
  133.         ret
  134. _gputblk    endp
  135.  
  136.  
  137.  
  138. gputblk        proc
  139.         irpc    cnt,<012345>
  140.          mov    eax,[esp+4+cnt*4]
  141.          mov    [_para+cnt*4],eax
  142.         endm
  143.         lea    eax,[_para]
  144.         call    _gputblk
  145.         ret
  146. gputblk        endp
  147.  
  148.  
  149.  
  150. _gputblk_16    proc
  151.         ret
  152. _gputblk_16    endp
  153.  
  154.  
  155. _gputblk_256    proc
  156.         ret
  157. _gputblk_256    endp
  158.  
  159.  
  160. ;---------------------------------------------------------------
  161. ;    _gblkcpy : ブロックコピー
  162. ;        in  eax : パラメータ配列へのポインタ
  163. ;    ※パラメータ配列:
  164. ;        + 0 DW  sx
  165. ;        + 4 DW  sy
  166. ;        + 8 DW  xlen
  167. ;        +12 DW  ylen
  168. ;        +16 DW  spage
  169. ;        +20 DW  dx
  170. ;        +24 DW  dy
  171. ;        +28 DW  dpage
  172. ;        +32 DW  operation
  173. ;    void gblkcpy(sx,sy,xlen,ylen,sp,dx,dy,dp, op)
  174. ;---------------------------------------------------------------
  175.  
  176.  
  177.  
  178. _gblkcpy    proc    near
  179.         pushfd
  180.         pushad
  181.         push    ds
  182.         push    es
  183.         push    fs
  184.         mov    ebp,eax
  185.         ;fs ←現在の ds
  186.         mov    ax,ds
  187.         mov    fs,ax
  188.         ;[_xcnt], [_ycnt]の設定
  189.         mov    eax,[ebp+8]
  190.         mov    [_xcnt],eax
  191.         mov    eax,[ebp+12]
  192.         mov    [_ycnt],eax
  193.         mov    eax,[ebp+32]
  194.         mov    [_op],eax
  195.         ;転送元/先の画面の1ラインのバイト数を調べる
  196.         mov    eax,fs:[ebp+16]
  197.         call    __getpscrmod
  198.         mov    ebx,fs:[_scrlsiz+eax*4]
  199.         mov    fs:[s_linesize],ebx
  200.         mov    eax,fs:[ebp+28]
  201.         call    __getpscrmod
  202.         mov    ebx,fs:[_scrlsiz+eax*4]
  203.         mov    fs:[d_linesize],ebx
  204.         push    eax
  205.         ;es:edi に転送先アドレスを設定
  206.         mov    eax,[ebp+28]
  207.         mov    ebx,[ebp+20]
  208.         mov    ecx,[ebp+24]
  209.         call    __getpadrs
  210.         mov    es,ax
  211.         mov    edi,ebx
  212.         ;ds:esi に転送元アドレスを設定
  213.         mov    eax,[ebp+16]
  214.         mov    ebx,[ebp+0]
  215.         mov    ecx,[ebp+4]
  216.         call    __getpadrs
  217.         mov    ds,ax
  218.         mov    esi,ebx
  219.         ;画面モードごとに分岐
  220.         pop    eax
  221.         cmp    eax,4
  222.         jg    #1
  223.             call    _gblkcpy_16    ;モード0~4
  224.             jmp    #2
  225.         #1:
  226.         cmp    eax,11
  227.         jg    #3
  228.             call    _gblkcpy_32k    ;モード5~11
  229.             jmp    #2
  230.         #3:
  231.         cmp    eax,14
  232.         jg    #4
  233.             call    _gblkcpy_256    ;モード12~14
  234.             jmp    #2
  235.         #4:
  236.             call    _gblkcpy_32k    ;モード15~
  237.         #2:
  238.         pop    fs
  239.         pop    es
  240.         pop    ds
  241.         popad
  242.         popfd
  243.         ret
  244. _gblkcpy    endp
  245.  
  246.  
  247.  
  248. gblkcpy        proc
  249.         irpc    cnt,<012345678>
  250.          mov    eax,[esp+4+cnt*4]
  251.          mov    [_para+cnt*4],eax
  252.         endm
  253.         lea    eax,[_para]
  254.         call    _gblkcpy
  255.         ret
  256. gblkcpy        endp
  257.  
  258.  
  259.  
  260. _gblkcpy_16    proc
  261.         ret
  262. _gblkcpy_16    endp
  263.  
  264.  
  265. _gblkcpy_256    proc
  266.         ret
  267. _gblkcpy_256    endp
  268.  
  269.  
  270. ;---------------------------------------------------------------
  271. ;    _gblkcpy_32k : ブロックコピー・3万色モードの場合
  272. ;        in    fs        データセグメントのセレクタ
  273. ;            [_xcnt]        X方向のドット数
  274. ;            [_ycnt]        Y方向のドット数
  275. ;            es:edi        転送先の基準アドレス
  276. ;            ds:esi        転送元の基準アドレス
  277. ;            [d_linesize]    転送先の1ラインのバイト数
  278. ;            [s_linesize]    転送元の1ラインのバイト数
  279. ;            [_op]        演算指定
  280. ;---------------------------------------------------------------
  281.  
  282.  
  283. _gblkcpy_32k    proc
  284.         mov    eax,[_op]
  285.         or    eax,eax
  286.         jne    #2
  287.             mov    ebx,fs:[_ycnt]
  288.             #1:
  289.                 or    ebx,ebx
  290.                 jz    #0
  291.                 mov    ecx,fs:[_xcnt]
  292.                 push    edi
  293.                 push    esi
  294.                 rep movsw
  295.                 pop    esi
  296.                 pop    edi
  297.                 add    edi,fs:[d_linesize]
  298.                 add    esi,fs:[s_linesize]
  299.                 dec    ebx
  300.             jmp    #1
  301.             #0:
  302.             jmp    #3
  303.         #2:
  304.         cmp    eax,128    ;TPSET
  305.         jne    #4
  306.             mov    ebx,fs:[_ycnt]
  307.             #3001:
  308.                 or    ebx,ebx
  309.                 jz    #3002
  310.                 mov    ecx,fs:[_xcnt]
  311.                 push    edi
  312.                 push    esi
  313.                 #3003:
  314.                     or    ecx,ecx
  315.                     jz    #3004
  316.                     dec    ecx
  317.                     lodsw
  318.                     or    ax,ax
  319.                     jz    #3005
  320.                         stosw
  321.                         jmp    #3003
  322.                     #3005:
  323.                         add    edi,2
  324.                 jmp    #3003
  325.                 #3004:
  326.                 pop    esi
  327.                 pop    edi
  328.                 add    edi,fs:[d_linesize]
  329.                 add    esi,fs:[s_linesize]
  330.                 dec    ebx
  331.             jmp    #3001
  332.             #3002:
  333.             jmp    #3
  334.         #4:
  335.  
  336.  
  337.         #3:
  338.         ret
  339. _gblkcpy_32k    endp
  340.  
  341.  
  342.  
  343. cseg ends
  344.  
  345. end
  346.